home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.2 Applications 1996 May / SGI IRIX 6.2 Applications 1996 May.iso / dist / impr_dev.idb / usr / impressario / src / libimp / impSeek.c.z / impSeek.c
C/C++ Source or Header  |  1996-05-06  |  4KB  |  148 lines

  1. /**************************************************************************
  2.  *
  3.  *           Copyright (c)    1993 Silicon Graphics, Inc.
  4.  *            All Rights Reserved
  5.  *
  6.  *       THIS    IS UNPUBLISHED PROPRIETARY SOURCE CODE OF SGI
  7.  *
  8.  * The copyright notice above does not evidence any actual of intended
  9.  * publication of such source code, and is an unpublished work by Silicon
  10.  * Graphics, Inc. This material contains CONFIDENTIAL INFORMATION that is
  11.  * the property of Silicon Graphics, Inc. Any use, duplication or
  12.  * disclosure not specifically authorized by Silicon Graphics is strictly
  13.  * prohibited.
  14.  *
  15.  * RESTRICTED RIGHTS LEGEND:
  16.  *
  17.  * Use, duplication or disclosure by the Government is subject to
  18.  * restrictions as set forth in subdivision (c)(1)(ii) of the Rights in
  19.  * Technical Data and Computer Software clause at DFARS 52.227-7013,
  20.  * and/or in similar or successor clauses in the FAR, DOD or NASA FAR
  21.  * Supplement. Unpublished - rights reserved under the Copyright Laws of
  22.  * the United States. Contractor is SILICON GRAPHICS, INC., 2011 N.
  23.  * Shoreline Blvd., Mountain View, CA 94039-7311
  24.  **************************************************************************
  25.  *
  26.  * File: impSeek.c
  27.  *
  28.  * Description: Internal routines for seeking in an SGI Image file.
  29.  *
  30.  **************************************************************************/
  31.  
  32.  
  33. #ident "$Revision: 1.3 $"
  34.  
  35.  
  36. #include <stdio.h>
  37. #include <sys/types.h>
  38. #include <unistd.h>
  39. #include <errno.h>
  40. #include "impI.h"
  41.  
  42.  
  43. /**************************************************************************
  44.  *
  45.  * Function: _impSeekRow
  46.  *
  47.  * Description: Seeks in the specified image file to the row and channel
  48.  *    specified.
  49.  *
  50.  * Parameters: 
  51.  *    image (I) - image file to seek
  52.  *    row (I) - index of row to seek to. Note y = 0 is row 0, y = 1 is
  53.  *            row 1, etc.
  54.  *    channel (I) - channel number (0 based).
  55.  *
  56.  * Return: New image file pointer offset if successful. -1 is returned
  57.  *    and IMPerrno is set if an error has occurred.
  58.  *
  59.  **************************************************************************/
  60.  
  61. off_t _impSeekRow(IMPImage *image, ushort_t row, ushort_t channel)
  62. {
  63.     /*
  64.      * Validate the row and channel inputs
  65.      */
  66.     if (_impBadRow(image, row, channel))
  67.     _impReturnError(IMP_ERR_BADROW);
  68.  
  69.     /*
  70.      * Remember where we seeked to in terms of row and channel
  71.      */
  72.     image->x = 0;
  73.     image->y = row;
  74.     image->z = channel;
  75.  
  76.     /*
  77.      * Now compute the offset for the specified row and channel
  78.      * and seek to this offset.
  79.      */
  80.     if (impIsVERBATIM(image)) {
  81.     switch (impDimension(image)) {
  82.         case 1:
  83.         return _impSeekOffset(image, image->start + _IMP_TABLES_START);
  84.         case 2:
  85.         return _impSeekOffset(image, image->start + _IMP_TABLES_START +
  86.             row * impXSize(image) * impRasterBPP(image));
  87.         case 3:
  88.         return _impSeekOffset(image, image->start + _IMP_TABLES_START +
  89.             (row * impXSize(image) +
  90.              channel * impXSize(image) * impYSize(image)) *
  91.              impRasterBPP(image));
  92.         default:
  93.         _impReturnError(IMP_ERR_BADDIM);
  94.     }
  95.     }
  96.     else if (impIsRLE(image)) {
  97.     switch (impDimension(image)) {
  98.         case 1:
  99.         return _impSeekOffset(image, image->start +
  100.                         image->rowstart[0]);
  101.         case 2:
  102.         return _impSeekOffset(image, image->start +
  103.                         image->rowstart[row]);
  104.         case 3:
  105.         return _impSeekOffset(image, image->start +
  106.             image->rowstart[row + channel * impYSize(image)]);
  107.         default:
  108.         _impReturnError(IMP_ERR_BADDIM);
  109.     }
  110.     }
  111.  
  112.     _impReturnError(IMP_ERR_BADIMAGE);
  113. }
  114.  
  115.  
  116. /**************************************************************************
  117.  *
  118.  * Function: _impSeekOffset
  119.  *
  120.  * Description: Seeks in the specified image file to the specified offset.
  121.  *    The seek is relative to the start of the file.
  122.  *
  123.  * Parameters: 
  124.  *    image (I) - image file to seek
  125.  *    offset (I) - offset to seek to
  126.  *
  127.  * Return: New image file offset if successful. -1 is returned and
  128.  *    IMPerrno is set if an error has occurred.
  129.  *
  130.  **************************************************************************/
  131.  
  132. off_t _impSeekOffset(IMPImage *image, off_t offset)
  133. {
  134.     off_t off = offset;
  135.  
  136.     if (image->offset != offset) {
  137.     image->offset = offset;
  138.     if (image->cache == IMPNoCache) {
  139.         if ((off = lseek(image->file, offset, SEEK_SET)) < 0)
  140.             _impReturnError(errno);
  141.     } else {
  142.         if (offset > image->cacheoffset + image->cachesize)
  143.         off = image->cachesize + image->cacheoffset;
  144.     }
  145.     }
  146.     return off;
  147. }
  148.